home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 3.2 / Ham Radio Version 3.2 (Chestnut CD-ROMs)(1993).ISO / packet / n17jsrc / nr4mail.c < prev    next >
C/C++ Source or Header  |  1991-06-01  |  4KB  |  184 lines

  1. /* NETROM mailbox interface
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  *
  4.  *    May '91    Bill Simpson
  5.  *        move to separate file for compilation & linking
  6.  */
  7. #include <ctype.h>
  8. #include "global.h"
  9. #include "proc.h"
  10. #include "netrom.h"
  11. #include "socket.h"
  12. #include "session.h"
  13. #include "cmdparse.h"
  14. #include "commands.h"
  15. #include "mailbox.h"
  16. #include "nr4mail.h"
  17.  
  18.  
  19. static int Nrsocket = -1;
  20.  
  21.  
  22. int
  23. nr4start(argc,argv,p)
  24. int argc;
  25. char *argv[];
  26. void *p;
  27. {
  28.     int s,type;
  29.  
  30.     if (Nrsocket != -1)
  31.         return -1;
  32.  
  33.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  34.     chname(Curproc,"NETROM listener");
  35.     Nrsocket = socket(AF_NETROM,SOCK_SEQPACKET,0);
  36.     /* bind() is done automatically */
  37.     if (listen(Nrsocket,1) == -1) {
  38.         close_s(Nrsocket);
  39.         Nrsocket = -1;
  40.         return -1;
  41.     }
  42.     for(;;){
  43.         if((s = accept(Nrsocket,NULLCHAR,NULLINT)) == -1)
  44.             break;    /* Service is shutting down */
  45.  
  46.         type = NRSESSION;
  47.         newproc("mbox",2048,mbx_incom,s,(void *)type,NULL,0);
  48.     }
  49.     close_s(Nrsocket);
  50.     Nrsocket = -1;
  51.     return 0;
  52. }
  53. int
  54. nr40(argc,argv,p)
  55. int argc;
  56. char *argv[];
  57. void *p;
  58. {
  59.     close_s(Nrsocket);
  60.     Nrsocket = -1;
  61.     return 0;
  62. }
  63.  
  64.  
  65. static int dombnrident __ARGS((int argc,char *argv[],void *p));
  66. static int dombnrnodes __ARGS((int argc,char *argv[],void *p));
  67. static int dombnrconnect __ARGS((int argc,char *argv[],void *p));
  68.  
  69. static char mbnrid[80];
  70.  
  71. static struct cmds Mbnrcmds[] = {
  72.     "",        donothing,    0, 0, NULLCHAR,
  73.     "connect",    dombnrconnect,    0, 0, NULLCHAR,
  74.     "ident",    dombnrident,    0, 0, NULLCHAR,
  75.     "nodes",    dombnrnodes,    0, 0, NULLCHAR,
  76.     "users",    dombox,        0, 0, NULLCHAR,
  77.     NULLCHAR,    NULLFP,        0, 0, NULLCHAR,
  78. };
  79.  
  80. int
  81. dombnetrom(argc,argv,p)
  82. int argc;
  83. char *argv[];
  84. void *p;
  85. {
  86.     struct mbx *m;
  87.     char *cp;
  88.  
  89.     if(Nrifaces[0].iface == NULLIF){
  90.         tprintf("NET/ROM not activated.\n");
  91.         return 0;
  92.     }
  93.     m = (struct mbx *) p;
  94.     sprintf(mbnrid,"%s:%s",Nrifaces[0].alias,
  95.       pax25(m->line,Nrifaces[0].iface->hwaddr));
  96.     tprintf("Connected to %s    ",mbnrid);
  97.     dombescape(1,NULLCHARP,p);
  98.  
  99.     while(mbxrecvline(m->user,m->line,MBXLINE,m->escape) >= 0) {
  100.         for(cp = m->line; *cp; ++cp)    /* convert to lower case */
  101.             if(isupper(*cp))
  102.                 *cp = tolower(*cp);
  103.         if(cmdparse(Mbnrcmds,m->line,(void *)m) == -1)
  104.             tprintf("%s> Invalid command (CONNECT IDENT NODES USERS)\n",
  105.               mbnrid);
  106.     }
  107.     return 0;
  108. }
  109.  
  110. static int
  111. dombnrident(argc,argv,p)
  112. int argc;
  113. char *argv[];
  114. void *p;
  115. {
  116.     tprintf("%s> %s (%s)\n",mbnrid,Hostname,Version);
  117.     return 0;
  118. }
  119.  
  120. static int
  121. dombnrnodes(argc,argv,p)
  122. int argc;
  123. char *argv[];
  124. void *p;
  125. {
  126.     if(argc < 2)
  127.         return doroutedump();
  128.     return dorouteinfo(argc,argv,p);
  129. }
  130.  
  131. static int
  132. dombnrconnect(argc,argv,p)
  133. int argc;
  134. char *argv[];
  135. void *p;
  136. {
  137.     struct mbx *m;
  138.     char *np, buf[7];
  139.     int s;
  140.     struct sockaddr_nr lsocket, fsocket;
  141.     char alias[AXBUF];
  142.  
  143.     m = (struct mbx *) p;
  144.     if(!(m->privs & NETROM_CMD)){
  145.         tprintf(Noperm);
  146.         return 0;
  147.     }
  148.     if((s = socket(AF_NETROM,SOCK_SEQPACKET,0)) == -1){
  149.         tprintf(Nosock);
  150.         return 0;
  151.     }
  152.     lsocket.nr_family = AF_NETROM;
  153.     /* Set up our local username, bind would use Mycall instead */
  154.     if(strlen(m->name) > 6)
  155.         strncpy(buf,m->name,6);
  156.     else
  157.         strcpy(buf,m->name);
  158.     buf[6] = '\0';
  159.     putalias(alias,buf,0);
  160.     setcall(lsocket.nr_addr.user,alias);
  161.  
  162.     /* Putting anything else than Mycall here will not work */
  163.     memcpy(lsocket.nr_addr.node,Mycall,AXALEN);
  164.     bind(s,(char *)&lsocket,sizeof(struct sockaddr_nr));
  165.  
  166.     /* See if the requested destination could be an alias, and
  167.      * find and use it if it is.  Otherwise assume it is an ax.25
  168.      * address.
  169.      */
  170.     if(putalias(alias,argv[1],0) != -1 &&
  171.         (np = find_nralias(alias)) != NULLCHAR){
  172.         memcpy(fsocket.nr_addr.user,np,AXALEN);
  173.         memcpy(fsocket.nr_addr.node,np,AXALEN);
  174.     } else {    /* parse ax25 callsign */
  175.         /* Only the user callsign of the remote station is never used by */
  176.         /* NET/ROM, but it is needed for the psocket() call. */
  177.         setcall(fsocket.nr_addr.user,argv[1]);
  178.         setcall(fsocket.nr_addr.node,argv[1]);
  179.     }
  180.     fsocket.nr_family = AF_NETROM;
  181.     return gw_connect(m,s,(char *)&fsocket, sizeof(struct sockaddr_nr));
  182. }
  183.  
  184.